#ifndef __COMM_HPP__//-----------
#define __COMM_HPP__//-------------
#include <iostream>
#include <string>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <string.h>
#include <cstdlib>
using namespace std;
#include "log.hpp"


//控制key
const string pathname="/home/xy";
const int proj_id=0x6666;

//共享内存的大小--------建议:共享内存的大小一般是4KB-4096的整数倍
//如果4097,操作系统实际上给你的是4096*2?
//ipcs -m查看就是4097,操作系统认为你只要要4097,给你4097的权限,实际开的空间是4096*2
// const int size=4097;
const int size=4096;


Log log;

//获得key
key_t GetKey()
{
    key_t k=ftok(pathname.c_str(),proj_id);
    if(k<0)
    {
        log(Fatal,"ftok error : %s",strerror(errno));
        exit(1);
    }
    log(Info,"ftok success, key is %d",k);
    return k;
}

int GetShareMemHelper(int flag)
{
    key_t k =GetKey();
    //传入不同的flag
    //分别实现第一个进程的创建,和后续进程的获取
    int shmid =shmget(k,size,flag);
    if(shmid<0)
    {
        log(Fatal,"create share memory error:%s",strerror(errno));
        exit(2);
    }
    log(Info,"create share memory success , shmid :%d",GetKey());
    return shmid;
}

//创建共享内存shmid
//如果共享内存不存在,就创建.如果共享内存存在,就 出错返回!!!
//IPC_EXCL不单独使用,作用就是限制创建的共享内存是新的!!!
int CreateShm()
{
    return GetShareMemHelper(IPC_CREAT | IPC_EXCL | 0666);//-----共享内存的权限
}

//获取共享内存shmid
//如果共享内存不存在,就创建.如果共享内存存在,就直接获取-----我们所需要的
int GetShm()
{
    return GetShareMemHelper(IPC_CREAT);
}


#endif
